/*
Esta clase es la que me devuelve un "pedacito" del archivo que necesito
o sea, una diferencia no encontrada en el RECEPTOR
todas las optimizaciones de I/O se hacen aca
        USA STREAM BLOQUEANTES
*/
#ifndef LECTORDESEGMENTO_H_INCLUDED
#define LECTORDESEGMENTO_H_INCLUDED

#include <string>
#include "Diferencial.h"
#include <fstream>
#include "MyException.h"
#include "StreamBloqueante.h"
#include "const.h"
#include "ObtenerContenidosArchivo.h"
class LectorDeSegmento{
    private:
    std::string RutaFile;

    public:

    LectorDeSegmento(const std::string& rute):RutaFile(rute){}

    // La posicion inicial se cuenta desde 0
    // Te devuelve el contenido desde pos ini hasta pos ini + cant
    // EXCEPTIONS  * SI NO PUDO ABRIR FILE
    std::string getDif(unsigned int PosInicial,unsigned int Cant)
    {
        StreamBloqueante SBloq(this->RutaFile,std::ios::ate | std::ios::in| std::ios::binary );
        std::fstream& FILE = SBloq.stream();
        unsigned int FileSize = FILE.tellg();
        FILE.seekg(PosInicial);
        std::string str;
        if ( FileSize != 0 )
        {
            if ( PosInicial + Cant > FileSize ){ Cant = FileSize - PosInicial ; }
            char* buff = new char[Cant+1];
            FILE.read(buff,Cant);
            buff[FILE.gcount()]='\0';
            BinToHex((uint8_t*)buff,FILE.gcount(),str);
            delete[] buff;
        }
        return str;
    }

    unsigned int getFileSize()
    {
        StreamBloqueante SBloq(this->RutaFile,std::ios::ate | std::ios::in| std::ios::binary );
        std::fstream& FILE = SBloq.stream();
        return FILE.tellg();
    }

};

#endif // LECTORDESEGMENTO_H_INCLUDED
